๊ธ๋ก๋ฒ ํต์ฐฐ๋ ฅ๊ณผ ์ค์ฉ์ ์ธ ์์๋ฅผ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ WebCodecs AudioDecoder์ ์ํํ ์ค์๊ฐ ์ค๋์ค ์ฒ๋ฆฌ๋ฅผ ๊ฒฝํํด ๋ณด์ธ์.
WebCodecs AudioDecoder: ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ์ค์๊ฐ ์ค๋์ค ์ฒ๋ฆฌ ํ์
์น ๊ธฐ์ ์ ๋์์์ด ์งํํ๋ ํ๊ฒฝ์์ ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ์ค์๊ฐ์ผ๋ก ์ค๋์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ๊ด๋ฒ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ์ธ ๊ตฌ์ฑ ์์๊ฐ ๋์์ต๋๋ค. ๋ํํ ํต์ ํ๋ซํผ, ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ ์๋น์ค๋ถํฐ ๋ชฐ์ ํ ๊ฒ์ ๊ฒฝํ ๋ฐ ๊ณ ๊ธ ์ค๋์ค ์ ์ ๋๊ตฌ์ ์ด๋ฅด๊ธฐ๊น์ง ์ํํ๊ณ ๋ฎ์ ์ง์ฐ ์๊ฐ์ ์ค๋์ค ์กฐ์์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค. WebCodecs API๋ฅผ ์๊ฐํฉ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ค๋์ค๋ฅผ ํฌํจํ ๋ฉํฐ๋ฏธ๋์ด๋ฅผ ์ ๋ก ์๋ ์ ์ด๋ ฅ๊ณผ ํจ์จ์ฑ์ผ๋ก ์ก์ธ์ค, ๋์ฝ๋ฉ ๋ฐ ์ธ์ฝ๋ฉํ ์ ์๋๋ก ์ง์ํ๋ ํ๊ธฐ์ ์ธ ๋ธ๋ผ์ฐ์ ํ์ค์ ๋๋ค. ํต์ฌ์๋ ์ค์๊ฐ ์ค๋์ค ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ์ํด ํน๋ณํ ์ค๊ณ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ธ AudioDecoder๊ฐ ์์ต๋๋ค.
์ค์๊ฐ ์ค๋์ค ์ฒ๋ฆฌ์ ํ์์ฑ ์ดํด
๊ณผ๊ฑฐ์๋ ์น์์ ๋ณต์กํ ์ค๋์ค ์ฒ๋ฆฌ ์์ ์ด ์ข ์ข ์๋ฒ ์ธก ์๋ฃจ์ ์ด๋ ์ฑ๋ฅ ๋ฐ ์ง์ฐ ์๊ฐ๊ณผ ๊ด๋ จํ์ฌ ์ด๋ ค์์ ๊ฒช๋ ๋ฒ๊ฑฐ๋ก์ด JavaScript ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ์ต๋๋ค. ์ด๋ ์ฆ๊ฐ์ ์ธ ์ค๋์ค ํผ๋๋ฐฑ ๋ฐ ์กฐ์์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋นํ ์ฅ๋ฒฝ์ ๋ง๋ค์์ต๋๋ค. ๋ค์ ๊ธ๋ก๋ฒ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ๊ธ๋ก๋ฒ ์ปค๋ฎค๋์ผ์ด์ ํ๋ซํผ: ๋ค๊ตญ์ ๊ธฐ์ ์์ ์ฌ์ฉํ๋ ํ์ ํ์ ์๋น์ค๋ฅผ ์์ํด ๋ณด์ญ์์ค. ์์ฝ๋ฅผ ์ต์ํํ๊ณ ์ฐธ์ฌ์๊ฐ ํ์ฅ์ ์๋ ๊ฒ์ฒ๋ผ ๋๋ผ๋๋ก ํ๊ธฐ ์ํด ์๋ก ๋ค๋ฅธ ๋๋ฅ์์ ๋ช ํํ๊ณ ์์ฐ์ค๋ฌ์ด ๋ํ๋ฅผ ์ํด์๋ ๋ฎ์ ์ง์ฐ ์๊ฐ ์ค๋์ค ๋์ฝ๋ฉ์ด ํ์์ ์ ๋๋ค.
- ๋ผ์ด๋ธ ์์ ์คํธ๋ฆฌ๋ฐ ๋ฐ ํ์ : ์ ์ธ๊ณ์ ์์ ๊ฐ๋ค์ ์ต์ํ์ ์ง์ฐ ์๊ฐ์ผ๋ก ์๋ก์ ๊ณต์ฐ์ ๋ค์ด์ผ ํฉ๋๋ค. WebCodecs์ ์ค์๊ฐ ์ค๋์ค ๋์ฝ๋ฉ์ ๋๊ธฐํ๋ ์ผ ์ธ์ ๋ฐ ๋ผ์ด๋ธ ๋ฐฉ์ก ๊ฐ์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ๋ํํ ๊ต์ก ๋ฐ ํ๋ จ: ์จ๋ผ์ธ ํ์ต ํ๋ซํผ์ ๋ํํ ์ฐ์ต, ์ธ์ด ํ์ต ๋ฐ์ ํผ๋๋ฐฑ ๋ฐ ์ฌ์ฉ์ ์ค๋์ค ์ ๋ ฅ์ ๋ฐ๋ผ ๋์ ๋ ์จ ์กฐ์ ์ ์ํด ์ค์๊ฐ ์ค๋์ค ์ฒ๋ฆฌ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
- ๊ฒ์ ๋ฐ ๋ํํ ์ํฐํ ์ธ๋จผํธ: ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ๋ฉํฐํ๋ ์ด์ด ๊ฒ์์ ๊ฒฝ์ฐ ์ ํํ๊ณ ์ ์ ํ ์ค๋์ค ์ ํธ๊ฐ ๊ฒ์ ํ๋ ์ด์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ค์๊ฐ ๋์ฝ๋ฉ์ ํตํด ํ๋ ์ด์ด๋ ๋๊ทธ ์์ด ์ํฅ ํจ๊ณผ ๋ฐ ์บ๋ฆญํฐ ์ค๋์ค๋ฅผ ์์ ํ์ฌ ๋ชฐ์ ๋๋ฅผ ๋์ ๋๋ค.
- ์ ๊ทผ์ฑ ๋๊ตฌ: ๊ฐ๋ฐ์๋ ์ฒญ๊ฐ ์ฅ์ ๊ฐ ์๋ ์ฌ๋๋ค์ ์ํด ์ค์๊ฐ ์ค๋์ค ๋น์ฃผ์ผ๋ผ์ด์ ๋๋ ๊ฐ์ธํ๋ ์ค๋์ค ํฅ์ ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ๊ณ ๊ธ ์ค์๊ฐ ์ค๋์ค ์ฒ๋ฆฌ ๋๊ตฌ๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์๋ ํจ์จ์ ์ธ ๋ธ๋ผ์ฐ์ ๋ด ์ค๋์ค ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๋ํ ๋ณดํธ์ ์ธ ์๊ตฌ ์ฌํญ์ ๊ฐ์กฐํฉ๋๋ค. WebCodecs AudioDecoder๋ ์ด ์๊ตฌ ์ฌํญ์ ์ง์ ํด๊ฒฐํ์ฌ ํ์คํ๋๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
WebCodecs API ๋ฐ AudioDecoder ์๊ฐ
WebCodecs API๋ ์ค๋์ค ๋ฐ ๋น๋์ค ์ฝ๋ฑ์ ๋ํ ๋ฎ์ ์์ค์ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค ์งํฉ์ ๋๋ค. ๊ฐ๋ฐ์๋ ๋ฏธ๋์ด ์์ค ํ์ฅ(MSE) ๋๋ HTMLMediaElement์ ๊ธฐ์กด ํ์ดํ๋ผ์ธ์ ๊ฑฐ์น์ง ์๊ณ ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ์ธ์ฝ๋ฉ๋ ๋ฏธ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ , ์ฒ๋ฆฌํ๊ณ , ์ธ ์ ์์ต๋๋ค. ์ด๋ ๋ ์ธ๋ถํ๋ ์ ์ด ์์ค์ ์ ๊ณตํ๋ฉฐ ์๋นํ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
AudioDecoder๋ ์ด API ๋ด์ ํต์ฌ ์ธํฐํ์ด์ค์ ๋๋ค. ์ฃผ์ ๊ธฐ๋ฅ์ ์ธ์ฝ๋ฉ๋ ์ค๋์ค ๋ฐ์ดํฐ(์: AAC, Opus)๋ฅผ ๊ฐ์ ธ์ ๋ธ๋ผ์ฐ์ ์์ ์กฐ์ํ๊ฑฐ๋ ๋ ๋๋งํ ์ ์๋ ์์ ์ค๋์ค ํ๋ ์์ผ๋ก ๋ณํํ๋ ๊ฒ์ ๋๋ค. ์ด ํ๋ก์ธ์ค๋ ๋จ์ํ ์ฌ์ํ๋ ๊ฒ์ด ์๋๋ผ ๋์ฐฉํ๋ ์ค๋์ค ์คํธ๋ฆผ์ผ๋ก ์์ ํด์ผ ํ๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ์ ๋๋ค.
AudioDecoder์ ์ฃผ์ ๊ธฐ๋ฅ:
- ๋ฎ์ ์์ค์ ์ก์ธ์ค: ์ธ์ฝ๋ฉ๋ ์ค๋์ค ์ฒญํฌ์ ์ง์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
- ์ฝ๋ฑ ์ง์: ๋ธ๋ผ์ฐ์ ๊ตฌํ์ ๋ฐ๋ผ ๋ค์ํ ์ผ๋ฐ ์ค๋์ค ์ฝ๋ฑ(์: AAC, Opus)์ ์ง์ํฉ๋๋ค.
- ์ค์๊ฐ ์ฒ๋ฆฌ: ์ค๋์ค ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ๋ ๋๋ก ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์ด ๋ฎ์ ์ง์ฐ ์๊ฐ ์์ ์ ์ง์ํฉ๋๋ค.
- ํ๋ซํผ ๋ ๋ฆฝ์ฑ: ์ต์ ํ๋ ์ฑ๋ฅ์ ์ํด ๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ๋์ฝ๋ฉ ๊ธฐ๋ฅ์ ํ์ฉํฉ๋๋ค.
AudioDecoder ์๋ ๋ฐฉ์: ๊ธฐ์ ์ ์ธ ์ฌ์ธต ๋ถ์
WebCodecs AudioDecoder์ ์ํฌํ๋ก๋ ๋ช ๊ฐ์ง ๋๋ ทํ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ด๋ฌํ ๋จ๊ณ๋ฅผ ์ดํดํ๋ ๊ฒ์ ํจ๊ณผ์ ์ธ ๊ตฌํ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
1. ์ด๊ธฐํ ๋ฐ ๊ตฌ์ฑ:
๋์ฝ๋ฉ์ด ์ํ๋๊ธฐ ์ ์ AudioDecoder ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ฌ์ฉ ์ค์ธ ์ฝ๋ฑ ๋ฐ ํด๋น ๋งค๊ฐ๋ณ์๋ฅผ ํฌํจํ์ฌ ์ค๋์ค ์คํธ๋ฆผ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์์
์ด ํฌํจ๋ฉ๋๋ค. ๊ตฌ์ฑ์ AudioDecoderConfig ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค.
const decoder = new AudioDecoder({
output: frame => {
// Process the decoded audio frame here
console.log('Decoded audio frame:', frame);
},
error: error => {
console.error('Audio decoding error:', error);
}
});
const config = {
codec: 'opus',
sampleRate: 48000,
numberOfChannels: 2
};
decoder.configure(config);
์ฌ๊ธฐ์์ ์์ ํ ์ค๋์ค ํ๋ ์์ด ์ฑ๊ณต์ ์ผ๋ก ๋์ฝ๋ฉ๋ ๋๋ง๋ค output ์ฝ๋ฐฑ์ด ํธ์ถ๋ฉ๋๋ค. error ์ฝ๋ฐฑ์ ๋์ฝ๋ฉ ํ๋ก์ธ์ค ์ค์ ๋ฐ์ํ๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
2. ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ ์์ :
์ธ์ฝ๋ฉ๋ ์ค๋์ค ๋ฐ์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก AudioDecoderConfig ์ฒญํฌ ๋๋ EncodedAudioChunk ๊ฐ์ฒด๋ผ๊ณ ํ๋ ์ฒญํฌ๋ก ๋์ฐฉํฉ๋๋ค. ์ด๋ฌํ ์ฒญํฌ์๋ ํ์์คํฌํ์ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ์ ํจ๊ป ์์ถ๋ ์ค๋์ค ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ ๋คํธ์ํฌ ์คํธ๋ฆผ(์: WebRTC, ๋ฏธ๋์ด ์์ค ํ์ฅ) ๋๋ ํ์ผ์์ ์ด๋ฌํ ์ฒญํฌ๋ฅผ ์์ ํ๋ ๊ฒ์
๋๋ค. ๊ฐ ์ฒญํฌ๋ EncodedAudioChunk ๊ฐ์ฒด ๋ด์ ์บก์ํ๋์ด์ผ ํฉ๋๋ค.
// Assuming 'encodedData' is a Uint8Array containing encoded audio bytes
// and 'timestamp' is the presentation timestamp (in microseconds)
const chunk = new EncodedAudioChunk({
type: 'key',
data: encodedData, // The raw encoded audio bytes
timestamp: timestamp
});
decoder.receive(chunk);
type ์์ฑ์ 'key' ๋๋ 'delta'์ผ ์ ์์ต๋๋ค. ์ค๋์ค์ ๊ฒฝ์ฐ ๋น๋์ค๋ณด๋ค ๋ ์ค์ํ์ง๋ง ํ์ ์์ฑ์
๋๋ค. timestamp๋ ์ฌ๋ฐ๋ฅธ ์ฌ์ ์์์ ๋๊ธฐํ๋ฅผ ์ ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
3. ๋์ฝ๋ฉ๋ ํ๋ ์ ์ฒ๋ฆฌ:
decoder.receive(chunk) ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ๋ธ๋ผ์ฐ์ ์ ๋ด๋ถ ๋์ฝ๋ ์์ง์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ฑ๊ณต์ ์ธ ๋์ฝ๋ฉ ์ ์ด๊ธฐํ ์ค์ ์ ๊ณต๋ output ์ฝ๋ฐฑ์ด ์คํ๋์ด AudioFrame ๊ฐ์ฒด๋ฅผ ์์ ํฉ๋๋ค. ์ด AudioFrame์๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ฉด PCM ํ์์ ์์, ์์ถ๋์ง ์์ ์ค๋์ค ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
AudioFrame ๊ฐ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ ์ ๊ณตํฉ๋๋ค.
timestamp: ํ๋ ์์ ํ๋ ์ ํ ์ด์ ํ์์คํฌํ์ ๋๋ค.duration: ์ค๋์ค ํ๋ ์์ ์ง์ ์๊ฐ์ ๋๋ค.sampleRate: ๋์ฝ๋ฉ๋ ์ค๋์ค์ ์ํ ์๋์ ๋๋ค.numberOfChannels: ์ค๋์ค ์ฑ๋ ์(์: ๋ชจ๋ ธ, ์คํ ๋ ์ค).codedSize: ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ(๋ฐ์ดํธ)์ ๋๋ค.data: ์์ ์ค๋์ค ์ํ์ด ํฌํจ๋ AudioData ๊ฐ์ฒด์ ๋๋ค.
AudioData ๊ฐ์ฒด ์์ฒด์๋ ์ค์ ์ค๋์ค ์ํ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ด์ ์ง์ ์ก์ธ์คํ์ฌ ์กฐ์ํ ์ ์์ต๋๋ค.
4. ๋ ๋๋ง ๋๋ ์ถ๊ฐ ์ฒ๋ฆฌ:
๊ทธ๋ฐ ๋ค์ ๋์ฝ๋ฉ๋ ์์ ์ค๋์ค ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
- AudioContext ๋ ๋๋ง: ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ๋์ฝ๋ฉ๋ ์ค๋์ค๋ฅผ ์ฌ์, ๋ฏน์ฑ ๋๋ ํจ๊ณผ ์ ์ฉ์ ์ํด Web Audio API์
AudioContext์ ๊ณต๊ธํ๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์๋AudioBufferSourceNode๋ฅผ ์์ฑํ๊ฑฐ๋ AudioContext์decodeAudioData๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํฌํจ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค(WebCodecs๋ ์ค์๊ฐ ์คํธ๋ฆผ์ ๊ฒฝ์ฐ ์ด๋ฅผ ์ฐํํ์ง๋ง). - ์ค์๊ฐ ๋ถ์: ์์ ์ค๋์ค ์ํ์ ๋นํธ ๊ฐ์ง, ํผ์น ๋ถ์ ๋๋ ์์ฑ ์ธ์์ ์ํด ๋ค์ํ ๋ชฉ์ ์ผ๋ก ๋ถ์ํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ ์ ํจ๊ณผ: ๊ฐ๋ฐ์๋ ์ฌ์ ์ ์ ๋์ฝ๋ฉ๋ ์ค๋์ค ๋ฐ์ดํฐ์ ์ฌ์ฉ์ ์ ์ ์ค๋์ค ํจ๊ณผ ๋๋ ๋ณํ์ ์ ์ฉํ ์ ์์ต๋๋ค.
- ๋ค๋ฅธ ํ์์ผ๋ก ์ธ์ฝ๋ฉ: ๋์ฝ๋ฉ๋ ์ค๋์ค๋ ์ ์ฅ ๋๋ ์คํธ๋ฆฌ๋ฐ์ ์ํด
AudioEncoder๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํ์์ผ๋ก ๋ค์ ์ธ์ฝ๋ฉํ ์๋ ์์ต๋๋ค.
// Example of feeding into AudioContext
const audioContext = new AudioContext();
// ... inside the output callback ...
output: frame => {
const audioBuffer = new AudioBuffer({
length: frame.duration * frame.sampleRate / 1e6, // duration is in microseconds
sampleRate: frame.sampleRate,
numberOfChannels: frame.numberOfChannels
});
// Assuming planar PCM data, copy it to the AudioBuffer
// This part can be complex depending on the AudioData format and desired channel mapping
// For simplicity, let's assume mono PCM for this example
const channelData = audioBuffer.getChannelData(0);
const frameData = frame.data.copyToChannel(0); // Simplified representation
channelData.set(new Float32Array(frameData.buffer, frameData.byteOffset, frameData.byteLength / Float32Array.BYTES_PER_ELEMENT));
const source = audioContext.createBufferSource();
source.buffer = audioBuffer;
source.connect(audioContext.destination);
source.start();
}
์ฐธ๊ณ : AudioData๋ฅผ ์ง์ ์กฐ์ํ๊ณ AudioBuffer์ ํตํฉํ๋ ๊ฒ์ ๋ณต์กํ ์ ์์ผ๋ฉฐ ์ฑ๋ ๋ ์ด์์ ๋ฐ ๋ฐ์ดํฐ ์ ํ์ ์ ์คํ๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
5. ๋์ฝ๋ ์ค๋ฅ ๋ฐ ๊ตฌ์ฑ ๋ณ๊ฒฝ ์ฒ๋ฆฌ:
๊ฐ๋ ฅํ ์ ํ๋ฆฌ์ผ์ด์
์ ๋์ฝ๋ฉ ์ค ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. error ์ฝ๋ฐฑ์ ์ด์ ํ์์ ์
๋๋ค. ๋ํ ์ค๋์ค ์คํธ๋ฆผ์ ํน์ฑ(์: ๋นํธ ์ ์ก๋ฅ ๋๋ ์ฝ๋ฑ ๋งค๊ฐ๋ณ์ ๋ณ๊ฒฝ)์ด ๋ณ๊ฒฝ๋๋ฉด decoder.configure()๋ฅผ ์ฌ์ฉํ์ฌ ์
๋ฐ์ดํธ๋ ๋งค๊ฐ๋ณ์๋ก ๋์ฝ๋๋ฅผ ๋ค์ ๊ตฌ์ฑํด์ผ ํ ์ ์์ต๋๋ค. ๋์ฝ๋๋ฅผ ๋ค์ ๊ตฌ์ฑํ๋ฉด ๋ด๋ถ ์ํ๊ฐ ์ฌ์ค์ ๋ ์ ์๋ค๋ ์ ์ ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ค์ฉ์ ์ธ ๊ตฌํ ์๋๋ฆฌ์ค ๋ฐ ๊ธ๋ก๋ฒ ์์
AudioDecoder๋ฅผ ์ค์ ์๋๋ฆฌ์ค์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ณ ๊ตญ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์๋๋ฆฌ์ค 1: ๊ธ๋ก๋ฒ ์ปจํผ๋ฐ์ค๋ฅผ ์ํ ์ค์๊ฐ ์์ฑ ํ๋ ๊ฐ์ง(VAD)
๋ฌธ์ ์ : ๋๊ท๋ชจ ๊ตญ์ ์ปจํผ๋ฐ์ค์์๋ ๋ฐฐ๊ฒฝ ์์์ ์ค์ด๊ณ ๋์ญํญ์ ์ต์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ฐ๋ฐ์๋ ์ค๋์ค ์คํธ๋ฆผ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฐธ๊ฐ์๊ฐ ์ ๊ทน์ ์ผ๋ก ๋งํ๊ณ ์์ ๋ ๊ฐ์งํด์ผ ํฉ๋๋ค.
์๋ฃจ์ : WebCodecs AudioDecoder๋ฅผ ์ฌ์ฉํ์ฌ ์ค์๊ฐ์ผ๋ก ์ค๋์ค๋ฅผ ๋์ฝ๋ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ์ค๋์ค ์ํ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ์ฌ์ฉ์ ์ ์ ๋ ผ๋ฆฌ๋ก ์ด๋ฌํ ์ํ์ ๋ถ์ํ์ฌ ์์ฑ ํ๋์ ๊ฐ์งํ ์ ์์ต๋๋ค. ์์ฑ์ด ๊ฐ์ง๋์ง ์์ผ๋ฉด ํด๋น ์ฐธ๊ฐ์์ ์ค๋์ค ์คํธ๋ฆผ์ ์์๊ฑฐํ๊ฑฐ๋ ๋ฎ์ ์ฐ์ ์์๋ก ์ ์กํ์ฌ ํ์ฑ ์คํผ์ปค์ ๋์ญํญ์ ์ ์ฝํ๊ณ ์ ์ฒด ์ค๋์ค ํ์ง์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด๋ ์ ๋ฝ์ ๋์ ์ค์ฌ์ง๋ถํฐ ์์์์ ์ธ๋ด ์ง์ญ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ์ธํฐ๋ท ์ธํ๋ผ๋ฅผ ๊ฐ์ง ์ง์ญ์์ ์ฌ์ฉ๋๋ ํ๋ซํผ์ ํ์์ ์ ๋๋ค.
๊ตฌํ ํต์ฐฐ๋ ฅ: AudioFrame.data๋ JavaScript ๋๋ WebAssembly๋ก ๊ตฌํ๋ VAD ์๊ณ ๋ฆฌ์ฆ์ ๊ณต๊ธ๋ ์ ์์ต๋๋ค. ๋์ฝ๋๊ฐ ๋์ฐฉํ๋ ๋๋ก ์ฒญํฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ VAD๊ฐ ์์ฑ ์์ ๋ฐ ์ข
๋ฃ์ ๋ฐ์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์๋๋ฆฌ์ค 2: ๋ผ์ด๋ธ ๋ค๊ตญ์ด ์๋ง ์์ฑ
๋ฌธ์ ์ : ๋ผ์ด๋ธ ์คํธ๋ฆผ์ ๋ํด ์ฌ๋ฌ ์ธ์ด๋ก ์ค์๊ฐ ์บก์ ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ณต์กํ ์์ ์ด๋ฉฐ, ๊ฐ ์ธ์ด์ ๋ํด ๋ณ๋์ ์ค๋์ค ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์๋ฃจ์ : WebCodecs AudioDecoder๋ฅผ ์ฌ์ฉํ๋ฉด ๋จ์ผ ์ค๋์ค ์คํธ๋ฆผ์ ์์ ์ค๋์ค๋ก ๋์ฝ๋ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด ์์ ์ค๋์ค๋ ์ฌ๋ฌ ์ธ์ด๋ฅผ ์ง์ํ๋ ์์ฑ-ํ ์คํธ ์์ง(์ ์ฌ์ ์ผ๋ก WebAssembly์์ ์คํ)์ ๊ณต๊ธ๋ ์ ์์ต๋๋ค. ์์ฑ๋ ํ ์คํธ๋ ์ค์๊ฐ์ผ๋ก ๋ฒ์ญ๋์ด ์บก์ ์ผ๋ก ํ์๋ ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ถ๋ฏธ, ์ํ๋ฆฌ์นด ๋ฐ ๊ทธ ์ธ ์ง์ญ์ ๋ค์ํ ์ฒญ์ค์๊ฒ ๋๋ฌํ๋ ๊ธ๋ก๋ฒ ๋ด์ค ๋ฐฉ์ก์ฌ, ๊ต์ก ๊ธฐ๊ด ๋ฐ ์ํฐํ ์ธ๋จผํธ ์ ๊ณต์ ์ฒด์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
๊ตฌํ ํต์ฐฐ๋ ฅ: AudioFrame์์ ๊ฐ์ ธ์จ ์ค๋์ค ์ํ์ ๋๋ถ๋ถ์ ์์ฑ ์ธ์ ๋ชจ๋ธ์ ์ง์ ์
๋ ฅ๋ฉ๋๋ค. ๋์ฝ๋์ ํจ์จ์ฑ์ ์บก์
์ง์ฐ์ ์ต์ํํ๋ ๋ฐ ํต์ฌ์ด ๋์ด ๋ผ์ด๋ธ ์ด๋ฒคํธ์ ์ ์ฉํ๊ฒ ๋ง๋ญ๋๋ค.
์๋๋ฆฌ์ค 3: ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ๋ํํ ์ ๊ธฐ ๋ฐ ํจ๊ณผ
๋ฌธ์ ์ : ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ์ ๊ธฐ ๋๋ ์ค๋์ค ํจ๊ณผ ์ฅ์น๋ฅผ ๋ง๋ค๋ ค๋ฉด ์ฌ์ฉ์ ์ ๋ ฅ๊ณผ ์ค๋์ค ์ ํธ๋ฅผ ๋งค์ฐ ๋ฎ์ ์ง์ฐ ์๊ฐ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
์๋ฃจ์ : ๊ฐ๋ฐ์๋ AudioDecoder๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์ดํฌ ๋๋ ์ฌ์ ๋ น์๋ ํธ๋์์ ๋ค์ด์ค๋ ์ค๋์ค๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋์ฝ๋ฉ๋ ์ค๋์ค ์ํ์ ์ค์๊ฐ์ผ๋ก ์กฐ์ํ์ฌ ํํฐ, ์ง์ฐ, ํผ์น ์ํํธ ๋๋ ์๋ก์ด ์๋ฆฌ๋ฅผ ํฉ์ฑํ ์ ์์ต๋๋ค. ์ด๋ ๋จ์๋ฉ๋ฆฌ์นด์์ ํธ์ฃผ์ ์ด๋ฅด๊ธฐ๊น์ง ์ ์ธ๊ณ์ ์์ ๊ฐ๋ค์ด ์ก์ธ์คํ ์ ์๋ ์จ๋ผ์ธ ์์ ์ ์ ์คํ๋์ค์ ๊ฐ์ ์ ๊ธฐ ๊ฒฝํ์ ๋ํ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค.
๊ตฌํ ํต์ฐฐ๋ ฅ: AudioFrame์ ์์ PCM ๋ฐ์ดํฐ๋ Web Audio API์ ๊ทธ๋ํ ๋๋ ์ฌ์ฉ์ ์ ์ ์๊ณ ๋ฆฌ์ฆ์ ์ํด ์ง์ ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ฃผ์ ์ด์ ์ ์ง์ ์ ์ธ ์ํ ์กฐ์์ ์ํด ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์ค๋์ค API์ ์ค๋ฒํค๋๋ฅผ ์ฐํํ๋ ๊ฒ์
๋๋ค.
์๋๋ฆฌ์ค 4: e-๋ฌ๋์ ๊ฐ์ธํ๋ ์ค๋์ค ๊ฒฝํ
๋ฌธ์ ์ : ์จ๋ผ์ธ ๊ต์ก, ํนํ ์ธ์ด ํ์ต์์ ๋ฐ์์ ๋ํ ์ฆ๊ฐ์ ์ด๊ณ ๊ฐ์ธํ๋ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ๊ฒ์ ๋งค์ฐ ํจ๊ณผ์ ์ด์ง๋ง ๊ธฐ์ ์ ์ผ๋ก ์ด๋ ต์ต๋๋ค.
์๋ฃจ์ : AudioDecoder๋ ํ์์ ๋งํ๊ธฐ ๋ฐ์์ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ ์ค๋์ค ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐ ๋ฐ์ ๋ชจ๋ธ๊ณผ ๋น๊ตํ์ฌ ๊ฐ์ ์์ญ์ ๊ฐ์กฐ ํ์ํ ์ ์์ต๋๋ค. ์ฆ์ ์ ๊ณต๋๋ ์ด ๊ฐ์ธํ๋ ํผ๋๋ฐฑ ๋ฃจํ๋ ์ ์ธ๊ณ์ ๋ค์ํ ๊ต์ก ์์คํ ์ ํ์๋ค์ ํ์ต ์ฑ๊ณผ๋ฅผ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ตฌํ ํต์ฐฐ๋ ฅ: ์ฌ์ฉ์๊ฐ ๋งํ ์งํ์ ์์ ์ค๋์ค ์ํ์ ๋น ๋ฅด๊ฒ ์ป๋ ๊ธฐ๋ฅ์ด ์ค์ํฉ๋๋ค. AudioFrame์ ํ์์คํฌํ ์ ๋ณด๋ ํ์์ ์ค๋์ค๋ฅผ ์ฐธ์กฐ ์์ ๋๋ ์ฑ์ ๊ธฐ์ค๊ณผ ๋๊ธฐํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
WebCodecs AudioDecoder ์ฌ์ฉ์ ์ฅ์
WebCodecs AudioDecoder๋ฅผ ์ฑํํ๋ฉด ๋ช ๊ฐ์ง ์ค์ํ ์ฅ์ ์ด ์์ต๋๋ค.
- ์ฑ๋ฅ: WebCodecs๋ ๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ๋์ฝ๋ฉ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ผ๋ฐ์ ์ผ๋ก ํน์ ์์ ์ ๋ํด JavaScript ๊ธฐ๋ฐ ๋์ฝ๋ ๋๋ ์ด์ ๋ธ๋ผ์ฐ์ API๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ๊ณผ ๋ฎ์ ์ง์ฐ ์๊ฐ์ ์ ๊ณตํฉ๋๋ค.
- ์ ์ด: ๊ฐ๋ฐ์๋ ๋์ฝ๋ฉ ํ๋ก์ธ์ค๋ฅผ ์ธ๋ฐํ๊ฒ ์ ์ดํ์ฌ ์ค๋์ค ์คํธ๋ฆผ์ ๊ณ ๊ธ ์กฐ์ ๋ฐ ๋ถ์์ ํ์ฉํฉ๋๋ค.
- ํจ์จ์ฑ: ํน์ ์ค๋์ค ์คํธ๋ฆผ ๋ถ๋ถ์ ์ฒ๋ฆฌํ๊ฑฐ๋ ์ ์ฒด ๋ฏธ๋์ด ์ฌ์์ด ํ์ํ์ง ์์ ํน์ ์์ ์ ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
- ํ์คํ: ์น ํ์ค์ด๋ฏ๋ก ์๋ก ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๋ฐ ํ๋ซํผ์์ ์ํธ ์ด์ฉ์ฑ ๋ฐ ์ผ๊ด์ฑ์ ์ด์งํฉ๋๋ค.
- ๋ฏธ๋ ๋ณด์ฅ: WebCodecs๋ฅผ ์์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ธ๋ผ์ฐ์ ๋ฉํฐ๋ฏธ๋์ด ๊ธฐ๋ฅ์ ํฅํ ํฅ์ ๋ฐ ์ต์ ํ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
๋ฌธ์ ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
๊ฐ๋ ฅํ์ง๋ง WebCodecs AudioDecoder๋ฅผ ๊ตฌํํ๋ ๋ฐ์๋ ํน์ ๊ณ ๋ ค ์ฌํญ๋ ์์ต๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ง์: WebCodecs๋ ๋น๊ต์ ์๋ก์ด API์ด๋ฉฐ, ์ง์์ด ๋น ๋ฅด๊ฒ ์ฆ๊ฐํ๊ณ ์์ง๋ง ๊ฐ๋ฐ์๋ ํญ์ ๋์ ๋ธ๋ผ์ฐ์ ๋ฐ ํ๋ซํผ์ ๋ํ ํธํ์ฑ์ ํ์ธํด์ผ ํฉ๋๋ค. ๊ธฐ๋ฅ ๋ฐ ์ฝ๋ฑ ์ง์์ ๋ค๋ฅผ ์ ์์ต๋๋ค.
- ๋ณต์ก์ฑ: ๋ฎ์ ์์ค์ API๋ก ์์ ํ๋ ค๋ฉด ๋ฉํฐ๋ฏธ๋์ด ๊ฐ๋ , ์ฝ๋ฑ ๋ฐ ๋ฐ์ดํฐ ํ์์ ๋ํ ๋ ๊น์ ์ดํด๊ฐ ํ์ํฉ๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋ฒํผ ๊ด๋ฆฌ๋ ์ ์คํ๊ฒ ๊ตฌํํด์ผ ํฉ๋๋ค.
- ์ฝ๋ฑ ๊ฐ์ฉ์ฑ: ์ง์๋๋ ํน์ ์ค๋์ค ์ฝ๋ฑ(์: Opus, AAC, MP3)์ ๋ธ๋ผ์ฐ์ ์ ๊ตฌํ ๋ฐ ๊ธฐ๋ณธ ์ด์ ์ฒด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๊ฐ๋ฐ์๋ ์ด๋ฌํ ์ ํ ์ฌํญ์ ์ธ์ํด์ผ ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: ํนํ ๋๋์ ๋ฐ์ดํฐ ๋๋ ๊ธด ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ ๋ ๋์ฝ๋ฉ๋ ์ค๋์ค ํ๋ ์ ๋ฐ ๊ด๋ จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ๋ณด์: ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ชจ๋ API์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฌ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ ๋ฐฉ์งํ๋ ค๋ฉด ๋ค์ด์ค๋ ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ์ ์ ์ ํ ์์ ์ฒ๋ฆฌ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ์ค์ํฉ๋๋ค.
AudioDecoder๋ฅผ ์ฌ์ฉํ ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๊ธ๋ก๋ฒ ์ฌ์ฉ์ ๊ธฐ๋ฐ์์ ์ฑ๊ณต์ ์ธ ๊ตฌํ์ ๋ณด์ฅํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ์ ์ง์ ๊ธฐ๋ฅ ๊ฐ์ : WebCodecs๋ฅผ ์์ ํ ์ง์ํ์ง ์์ ์ ์๋ ๋ธ๋ผ์ฐ์ ์์๋ ์ ๋๋ก ์๋ํ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ณํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ๋ ํจ์จ์ ์ธ ๋์ฒด ๋ฐฉ๋ฒ์ผ๋ก ๋๋์๊ฐ ์ ์์ต๋๋ค.
- ์ฒ ์ ํ ํ ์คํธ: ๊ธ๋ก๋ฒ ๋์ ์ฌ์ฉ์๋ฅผ ๋ํํ๋ ๋ค์ํ ์ฅ์น, ๋ธ๋ผ์ฐ์ ๋ฐ ๋คํธ์ํฌ ์กฐ๊ฑด์์ ๊ด๋ฒ์ํ๊ฒ ํ ์คํธํฉ๋๋ค. ์ง์ญ ๋คํธ์ํฌ ์ฑ๋ฅ ์ํฅ์ ์๋ณํ๊ธฐ ์ํด ๋ค์ํ ์ง๋ฆฌ์ ์์น์์ ํ ์คํธํ์ญ์์ค.
- ์ ์ตํ ์ค๋ฅ ๋ฉ์์ง: ๋์ฝ๋ฉ์ ์คํจํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ์์๊ฒ ๋ช ํํ๊ณ ์คํ ๊ฐ๋ฅํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ฌ ์ฝ๋ฑ ์๊ตฌ ์ฌํญ ๋๋ ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํธ์ ๋ํ ์ง์นจ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ์ฝ๋ฑ ๋ถ๊ฐ์ง๋ก (๊ฐ๋ฅํ ๊ฒฝ์ฐ): ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋งค์ฐ ๊ด๋ฒ์ํ ์ค๋์ค ์์ค๋ฅผ ์ง์ํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ค์ด์ค๋ ์ฝ๋ฑ์ ๊ฐ์งํ๊ณ ์ ์ ํ ๋์ฝ๋ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ ๋ ผ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ์ค๋์ค ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ CPU ์ฌ์ฉ๋, ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ํ๋กํ์ผ๋งํ๊ณ ์ ์ฌ์ ์ธ ๋ณ๋ชฉ ํ์์ ์๋ณํฉ๋๋ค.
- ๋ฌธ์ ๋ฐ ์ปค๋ฎค๋ํฐ: ์ต์ WebCodecs ์ฌ์ ๋ฐ ๋ธ๋ผ์ฐ์ ๊ตฌํ์ ๋ํ ์ต์ ์ ๋ณด๋ฅผ ์ ์งํ์ญ์์ค. ํนํ ๊ตญ์ ๊ตฌํ๊ณผ ๊ด๋ จํ์ฌ ํต์ฐฐ๋ ฅ๊ณผ ์ง์์ ์ํด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์ ๊ต๋ฅํ์ญ์์ค.
์น์์ ์ค์๊ฐ ์ค๋์ค์ ๋ฏธ๋
๊ฐ๋ ฅํ AudioDecoder ๊ตฌ์ฑ ์์๊ฐ ํฌํจ๋ WebCodecs API๋ ์น์์ ์ค์๊ฐ ์ค๋์ค ์ฒ๋ฆฌ์ ์์ด ์ค์ํ ๋์ฝ์ ๋ํ๋ ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ณต๊ธ์ ์ฒด๊ฐ ์ง์์ ๊ณ์ ๊ฐ์ ํ๊ณ ์ฝ๋ฑ ๊ฐ์ฉ์ฑ์ ํ์ฅํจ์ ๋ฐ๋ผ ์ด๋ฌํ ๊ธฐ๋ฅ์ ํ์ฉํ๋ ํ์ ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ ๊ฒ์ผ๋ก ์์ํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ์์ ์ง์ ์ค๋์ค ์คํธ๋ฆผ์ ๋์ฝ๋ฉํ๊ณ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ๋ํํ ์น ๊ฒฝํ์ ์ํ ์๋ก์ด ํ๋ฐํฐ์ด๋ฅผ ์ฝ๋๋ค. ์ํํ ๊ธ๋ก๋ฒ ์ปค๋ฎค๋์ผ์ด์ ๋ฐ ํ์ ์ฐฝ์ ๋๊ตฌ์์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ต์ก ํ๋ซํผ ๋ฐ ๋ชฐ์ ํ ์ํฐํ ์ธ๋จผํธ์ ์ด๋ฅด๊ธฐ๊น์ง WebCodecs AudioDecoder์ ์ํฅ์ ์ฐ์ ๊ณผ ๋๋ฅ ์ ์ฒด์์ ๋๊ปด์ง ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์๋ก์ด ํ์ค์ ์์ฉํ๊ณ ์ ์ฌ๋ ฅ์ ์ดํดํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์ด๋์์๋ ๋ชจ๋ ์ฌ๋์ ์ํด ๋์ฑ ๋ฐ์์ ์ด๊ณ ๋งค๋ ฅ์ ์ด๋ฉฐ ๊ธ๋ก๋ฒํ๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ ์ฐจ์ธ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์น์ด ๊ณ์ํด์ ์ธ์์ ์ถ์ํจ์ ๋ฐ๋ผ WebCodecs AudioDecoder์ ๊ฐ์ ๊ธฐ์ ์ ํต์ ๊ฒฉ์ฐจ๋ฅผ ํด์ํ๊ณ ๋ชจ๋๋ฅผ ์ํ ๋์ฑ ํ๋ถํ๊ณ ์ํธ ์์ฉ์ ์ธ ๋์งํธ ๊ฒฝํ์ ์กฐ์ฑํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค.